from sqlalchemy import create_engine,MetaData
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker


engine = create_engine("mysql+pymysql://root:9999@localhost:3306/zxzl?charset=utf8",
                       pool_size=10, max_overflow=3, echo_pool=True)
metadata = MetaData()
metadata.reflect(engine,only=['user'])
Base = automap_base(metadata=metadata)   # 表单自动映射
session = sessionmaker(bind=engine) # 订制会话
Base.prepare()

'''
user表单的插入函数，要求插入手机号tel，用户名username，密码passwd，有效信息is_valid。
tel : 手机号
username : 用户名
passwd : 密码
is_valid : 用户是否有效
插入成功返回 新插入的用户的id。
插入错误 返回 False
'''
def insert(tel, username, passwd, is_valid=True):
        User = Base.classes.user
        sess = session()
        if username and passwd:
                new_usr = User(tel=tel,username=username,passwd=passwd,is_valid=is_valid)
                try:
                        sess.add(new_usr)
                        sess.commit()
                        new_id = new_usr.id
                        sess.close()
                        return new_id
                except Exception as e:
                        print(e)
                        sess.rollback()
                        return False
        else:
                return False

'''
user表单查询函数，要求输入手机号tel，只能通过手机号和user_id查询
tel : 手机号
user_id : 用户id
查询成功返回 字典型语句对应键为id,tel,passwd,username,is_valid
查询失败返回 False
'''
def select(tel=None,id=None):
        User = Base.classes.user
        sess = session()
        if tel:
                usr = sess.query(User.id,User.tel,User.passwd,User.username,User.is_valid).filter_by(tel=tel).first()
        if id:
                usr = sess.query(User.id,User.tel,User.passwd,User.username,User.is_valid).filter_by(id=id).first()
        if usr is None:
                return False
        else:
                return ({"id":usr[0],"tel":usr[1],"passwd":usr[2],"username":usr[3],"is_valid":usr[4]})
        sess.close()

'''
user表单修改函数，要求手机号必填，然后其余为要更新的内容，带上前缀new
手机号已注册才能进行修改操作，new_username,new_passwd,new_tel等参数为新作的修改值
tel : 手机号
new_username : 新的用户名
new_passwd : 新的密码
new_tel : 新的手机号
is_valid : 默认账号有效
修改成功返回True 错误返回False
'''
def update(tel,new_username=None,new_passwd=None,is_valid=True,new_tel=None):    # tel为唯一标识符
        User = Base.classes.user
        sess = session()
        usr = sess.query(User).filter_by(tel=tel).first()
        if usr:          # 手机号注册了才能够进行修改，否则返回False
                if new_username:
                        usr.username = new_username
                if new_passwd :
                        usr.passwd = new_passwd
                if new_tel:
                        usr.tel =new_tel
                if is_valid:
                        usr.is_valid = is_valid
                try:
                        sess.commit()
                        sess.close()
                        return True
                except Exception as e:
                        print(e)
                        sess.rollback()
                        return False
        else:
                return False

'''
此为user表单删除函数，只通过手机号辨认然后删除
tel : 手机号
删除成功返回True   失败返回False
'''
def delete(tel):   # 用户注销
        User = Base.classes.user
        sess = session()
        usr = sess.query(User).filter_by(tel).first()
        if usr is None:
                return False
        else:
                try:
                       for i in usr:
                        sess.delete(i)
                       sess.commit()
                       sess.close()
                       return True
                except Exception as e:
                        print(e)
                        sess.rollback()
                        return False
        return False

#
# if __name__ == '__main__':
#         # insert(tel=123123, username='哈哈', passwd=123, is_valid=1)
#         # insert(tel=124142, username='耍手段', passwd=123, is_valid=1)
#         # insert(tel=534364, username='是的发送到', passwd=123, is_valid=1)
#         pass

